#ifndef DATACOLLECTOR_H
#define DATACOLLECTOR_H

#include <QObject>
#include <QTimer>
#include <QString>
#include <QVector>
#include "ModbusService.h"
#include "DatabaseService.h"
#include "entities/Device.h"
#include "entities/DataPoint.h"
#include "utils/ModbusHelper.h"

/**
 * @brief 数据采集器
 * @details 定时从 Modbus 设备采集数据并存储到数据库：
 *          - 使用 QTimer 控制采集周期
 *          - 自动解析寄存器数据为物理量
 *          - 保存到数据库 realtime_data 表
 */
class DataCollector : public QObject
{
    Q_OBJECT

public:
    explicit DataCollector(QObject *parent = nullptr);
    ~DataCollector() override;

    // 设置采集设备
    void setDevice(const Device &device);

    // 设置 Modbus 服务（由外部提供的连接）
    void setModbusService(ModbusService *service);

    // 设置采集周期（毫秒）
    void setCollectionInterval(int intervalMs);
    int collectionInterval() const { return m_collectionInterval; }

    // 启动/停止采集
    void startCollection();
    void stopCollection();

    // 获取采集状态
    bool isCollecting() const { return m_isCollecting; }

    // 获取采集统计
    int totalCollections() const { return m_totalCollections; }
    int successfulCollections() const { return m_successfulCollections; }
    int failedCollections() const { return m_failedCollections; }

signals:
    // 采集到新数据
    void dataCollected(const DataPoint &dataPoint);

    // 采集成功
    void collectionSuccess(const QString &deviceId);

    // 采集失败
    void collectionFailed(const QString &deviceId, const QString &error);

    // 采集状态变化
    void collectionStateChanged(bool isCollecting);

private slots:
    // 定时采集
    void onCollectData();

    // 处理寄存器读取成功
    void onRegistersRead(int startAddress, const QVector<quint16> &values);

    // 处理读取错误
    void onReadError(const QString &error);

private:
    bool saveToDatabase(const DataPoint &dataPoint);

private:
    ModbusService *m_modbusService; // Modbus 服务（外部提供）
    QTimer *m_collectionTimer;      // 采集定时器
    Device m_device;                // 当前采集设备
    int m_collectionInterval;       // 采集周期（毫秒）
    bool m_isCollecting;            // 是否正在采集

    // 采集统计
    int m_totalCollections;         // 总采集次数
    int m_successfulCollections;    // 成功次数
    int m_failedCollections;        // 失败次数

    bool m_waitingForReply;         // 是否正在等待响应
};

#endif // DATACOLLECTOR_H
